package com.ec.edu.server.hello;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class HelloNettyServer {

    /**
     * 定义一对线程组（两个线程池）
     */
    //主线程组，用于接收客户端的链接，但不做任何处理
    static EventLoopGroup bossGroup = new NioEventLoopGroup();
    //定义从线程组，主线程组会把任务转给从线程组进行处理
    static EventLoopGroup workerGroup = new NioEventLoopGroup();

    public static void start() throws InterruptedException {
        try {
            /**
             * 服务启动类，任务分配自动处理
             */
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup, workerGroup)
                    //设置NIO的双向通道
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG, 1024)
                    .childOption(ChannelOption.SO_KEEPALIVE, true)
                    //子处理器，用于处理workerGroup
                    /**
                     * 设置chanel初始化器
                     * 每一个chanel由多个handler共同组成管道(pipeline)
                     */
                    .childHandler(new HelloNettyServerInitializer());
            /**
             * 启动
             */
            //绑定端口，并设置为同步方式，是一个异步的chanel
            ChannelFuture channelFuture = serverBootstrap.bind(8888).sync();
            /**
             * 关闭
             */
            //获取某个客户端所对应的chanel，关闭并设置同步方式
            channelFuture.channel().closeFuture().sync();
        } catch (Exception e) {
            log.error("异常：", e);
        } finally {
            //使用一种优雅的方式进行关闭
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}
